package org.aeon.service;


import org.aeon.entity.User;
import org.aeon.entity.dto.UserDto;
import org.aeon.message.Message;

import java.util.List;

/**
 * 用户
 *
 * @author MissingAeon
 * @email nian0950@qq.com
 * @date 2024-01-25 17:39:34
 */
public interface UserService {

    /**
     * 登陆
     * 成功返回 实体对象
     *
     * @param username
     * @param password
     * @return
     */
    User login(String username, String password);

    /**
     * 下线处理
     *
     * @param userId
     */
    void userOffline(Long userId);

    /**
     * 通过获取用户名关联id
     *
     * @param username
     * @return
     */
    Long getUserId(String username);

    /**
     * 通过获取用户名关联id
     *
     * @param userId
     * @return
     */
    User getUserById(Long userId);

    /**
     * 通过id判断用户存在
     *
     * @param id
     * @return
     */
    boolean isUserExist(Long id);

    /**
     * 注册
     *
     * @param user
     * @return
     */
    User register(User user);

    /**
     * 获取用户信息
     *
     * @param userId
     * @return
     */
    UserDto getSimpleUser(Long userId);

    /**
     * 批量获取
     *
     * @param userId
     * @return
     */
    List<UserDto> getBatchUserInfo(List<Long> userId);

    /**
     * 检查列表中对应的用户缓存
     * 不存在则更新
     *
     * @param userIds
     */
    void checkUserCache(List<Long> userIds, String suffix);

    /**
     * 更新缓存
     *
     * @param userId 指定更新目标用户 可以为null更新所有
     * @return
     */
    boolean updateUserCache(Long... userId);

    /**
     * 模糊搜索
     *
     * @param keyword
     * @return
     */
    List<UserDto> fuzzySearch(String keyword);

    /**
     * 添加消息队列
     *
     * @param userId
     * @param message
     * @return
     */
    boolean addMessageToQueue(Long userId, Message message);

    /**
     * 消息队列中获取一个消息
     *
     * @param userId
     * @return
     */
    Message getMessage(Long userId);

    /**
     * 消息队列中所有消息
     *
     * @param userId
     * @return
     */
    List<Message> getAllMessages(Long userId);


    /**
     * 通过用户注册一个token将其保存于数据库同时返回
     *
     * @param userId
     * @param username
     * @param password
     * @return
     */
    String registerToken(Long userId, String username, String password);

    /**
     * 检查token匹配
     *
     * @param userId
     * @return
     */
    String checkTokens(Long userId);

    /**
     * 删除token
     *
     * @param userId
     * @return
     */
    void delTokens(Long userId);


}

